package com.sunl.mall.ali.mq.api.producer;

import com.aliyun.openservices.ons.api.Admin;
import com.sunl.mall.ali.mq.model.transaction.RocketMqTransactionMessageWrapper;
import com.sunl.mall.ali.mq.model.transaction.RocketMqTransactionSendResult;
import com.sunl.mall.ali.mq.serializer.RocketMqSerializer;


public interface RocketMqTransactionProducer extends Admin {
    /**
     * 发送消息
     *
     * @param message    消息体
     * @param executor   本地事务执行器
     * @param serializer 消息体序列化方式
     * @param <T>        消息正文类型
     * @return 发送狀態
     */
    <T> boolean send(RocketMqTransactionMessageWrapper<T> message, RocketMqLocalTransactionExecutor<T> executor, RocketMqSerializer<T> serializer);

    /**
     * 发送消息
     *
     * @param message    消息体
     * @param executor   本地事务执行器
     * @param args       额外参数，传递给 executor 内部使用
     * @param serializer 消息体序列化方式
     * @param <T>        消息正文类型
     * @return 发送狀態
     */
    <T> boolean send(RocketMqTransactionMessageWrapper<T> message, RocketMqLocalTransactionExecutor<T> executor, Object args, RocketMqSerializer<T> serializer);

    /**
     * 发送消息
     *
     * @param message    消息体
     * @param executor   本地事务执行器
     * @param serializer 消息体序列化方式
     * @param <T>        消息正文类型
     * @return 发送结果
     */
    <T> RocketMqTransactionSendResult sendBackResult(RocketMqTransactionMessageWrapper<T> message, RocketMqLocalTransactionExecutor<T> executor, RocketMqSerializer<T> serializer);

    /**
     * 发送消息
     *
     * @param message    消息体
     * @param executor   本地事务执行器
     * @param args       额外参数，传递给 executor 内部使用
     * @param serializer 消息体序列化方式
     * @param <T>        消息正文类型
     * @return 发送结果
     */
    <T> RocketMqTransactionSendResult sendBackResult(RocketMqTransactionMessageWrapper<T> message, RocketMqLocalTransactionExecutor<T> executor, Object args, RocketMqSerializer<T> serializer);
}